home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / gfx / opal / obrotold.lzh / OBrotold.c < prev    next >
C/C++ Source or Header  |  1993-02-16  |  3KB  |  116 lines

  1. /* OpalBrot.c  try and do a fractal pattern on OpalVision */
  2.  
  3.  
  4. #include <proto/all.h>
  5. #include <opal/opallib.h>
  6. #include <graphics/gfxbase.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>  /* lets give it something to REALLY Render */
  10. #include <m68881.h>
  11.  
  12. #include "renderer.c"
  13.  
  14. #define   DISP_W   736
  15. #define   DISP_H   476 /* hi-res screen */ 
  16.  
  17. __far UBYTE *Button = (UBYTE *)0xbfe001;    /* Nasty */
  18. __far UWORD *RButton= (UWORD *)0xdff016; /* read right button */
  19.         /* bit 10, use dff016 for right */
  20.     
  21.  
  22. struct GfxBase *GfxBase;
  23.  
  24.     /* external functions (int Renderer.c) */
  25. /* prototypes go here */
  26.  
  27. BOOL Open_OpalScreen (ULONG Modes);
  28. void Render_To_Opal (long Y, long Width, long Lines,
  29.             UBYTE *Red, UBYTE *Green, UBYTE *Blue, BOOL Chunky);
  30. void Opal_Render_Finished (void);
  31. void Close_Opal (void);
  32. int  Mandel(double,double,long);
  33.  
  34. int maxiter=133; /* max # of iterations */
  35.  
  36. UBYTE RedPlane[1000];
  37. UBYTE GreenPlane[1000];
  38. UBYTE BluePlane[1000];
  39.  
  40. void main (void)
  41. {
  42. register long x,y;
  43. double mx,my,xmin,xmax,ymin,ymax; /* mandlebrot data */ 
  44. double xstep,ystep;
  45. int it;
  46. char c;
  47.     xmin= -2.1; ymin= -1.3;    
  48.     xmax=  0.8; ymax= 1.3;
  49.     GfxBase = (struct GfxBase *) OpenLibrary ("graphics.library",0);
  50.     if (!Open_OpalScreen (HIRES24|ILACE24|OVERSCAN24))
  51.         { puts  ("Can't open opalvision screeen\n");
  52.           exit (0);
  53.     }
  54.         
  55.   /* entry point for multiple renders */ 
  56.   /* init the variables */     
  57.     xstep=(xmax-xmin)/(double) DISP_W; /* increment for each pixel */
  58.     ystep=(ymax-ymin)/(double) DISP_H;
  59.     mx=xmin;
  60.     my=ymin;     
  61.     for (y=0; y<DISP_H && (*Button &0x40); y++){  /*  LINE LOOP STARTS */
  62.          mx=xmin; /* we must reset mx each line */
  63.          for (x=0; x<DISP_W; x++) /* PIXEL LOOP STARTS */
  64.             {
  65.               it=Mandel( mx,my, maxiter); /* do the brot calcs */  
  66.               if (it==maxiter) {
  67.                     RedPlane[x]=GreenPlane[x]=BluePlane[x]=0; }
  68.               else {      
  69.                 RedPlane[x] = it*15 ; /* set pixels */
  70.                 GreenPlane[x] = 255-(it*3);
  71.                 BluePlane[x] = it*7 ; }
  72.               
  73.               mx+=xstep;
  74.             }           /* PIXEL LOOP ENDS */
  75.           Render_To_Opal (y,DISP_W,1,RedPlane,GreenPlane,BluePlane,FALSE);
  76.           my += ystep; /* set for next line */
  77.         }   /* LINE LOOP ENDS, WE RENDER FIRST */
  78.     Opal_Render_Finished ();
  79.     printf("done %d %d \n",x,y);
  80.     while (*Button &0x040)  { 
  81.         Delay (10L);
  82.         
  83.     } /* wait for button before exit */    
  84.     AmigaPriority();
  85.     printf(" Do you want to save it? (Y or N)");
  86.     c=getch();
  87.     if ( (c=='Y') || (c== 'y')) {
  88.          if ( !OScrn) OScrn=VScrn; /* if virtual */
  89.          SaveJPEG24( OScrn, "brot.jpg", NULL,75); /* save as jpeg */
  90.         }
  91.      printf("\n");    
  92.     Close_Opal ();
  93. }
  94.  
  95. int Mandel( cx, cy, maxit ) /* calculate mandelbrot iterations */
  96.   double cx, cy;
  97.   long   maxit;
  98.   {
  99.     register long   inum;
  100.     register double x, y, x2, y2,temp;
  101.     x = y = x2 = y2 = 0.0;
  102.     inum = 0L;
  103.     while( (inum < maxit)&& (( x2 + y2 )<  10000.0 ) )      {
  104.         temp = x2 - y2 + cx;
  105.         y *= 2.0 * x;
  106.         y += cy;
  107.         x = temp;
  108.         x2 = x * x;
  109.         y2 = y * y;
  110.         ++inum;
  111.          /* (( x2 + y2 )<  10000.0 ) */
  112.     }
  113.     return( inum );
  114. }
  115.  
  116.